package com.ruoyi.common.core.controller.custom;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.custom.Rlist;
import com.ruoyi.common.core.domain.custom.Robj;
import com.ruoyi.common.core.domain.custom.Rpage;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sql.SqlUtil;

import java.util.List;

/**
 * web层通用数据处理 增加对返回参数支持
 *
 * @author 众智汇云研发部
 * @date 2021-04-09 15:31
 */
@SuppressWarnings({"unused", "unchecked", "rawtypes}"})
public class CustomController extends BaseController {

    /**
     * startPage isAsc 升序
     */
    public static final String ASC = "asc";

    /**
     * startPage isAsc 降序
     */
    public static final String DESC = "desc";

    /**
     * 返回对象（Objec通用）
     *
     * @param code 状态码
     * @param msg  信息
     * @param data 数据
     * @param <V>  类型
     * @return 封装返回数据
     */
    protected <V> V ro(int code, String msg, Object data) {
        return (V) new Robj(code, msg, data);
    }

    /**
     * 返回对象（Objec成功）
     *
     * @param data 数据
     * @param <V>  类型
     * @return 封装返回数据
     */
    protected <V> V ros(Object data) {
        return (V) new Robj(HttpStatus.SUCCESS, "success", data);
    }

    /**
     * 返回对象（Objec异常）
     */
    public <V> V roe(String msg) {
        return (V) new Robj(HttpStatus.ERROR, msg, null);
    }

    /**
     * 无分页数据的List<Object>返回类型
     */
    protected <V> V rls(List<?> list) {

        Rlist r = new Rlist();
        r.setCode(HttpStatus.SUCCESS);
        if (null != list) {
            r.setData(list);
        }
        return (V) r;

    }

    /**
     * 无分页数据的List<Object>返回类型
     */
    protected <V> V rle(String msg) {

        Rlist r = new Rlist();
        r.setCode(HttpStatus.ERROR);
        r.setMsg(msg);
        return (V) r;

    }

    /**
     * 返回分页对象（page成功）
     *
     * @param list 数据集合
     * @param <V>  类型
     * @return 封装返回数据
     */
    protected <V> V rps(List<?> list) {

        Rpage r = new Rpage();
        r.setCode(HttpStatus.SUCCESS);
        if (null != list) {
            r.setTotal(new PageInfo(list).getTotal());
            r.setRows(list);
        } else {
            r.setTotal(0);
        }
        return (V) r;

    }


    /**
     * 返回分页对象（page异常）
     *
     * @param msg 信息
     * @param <V> 类型
     * @return
     */
    protected <V> V rpe(String msg) {

        Rpage r = new Rpage();
        r.setCode(HttpStatus.ERROR);
        r.setMsg(msg);
        return (V) r;

    }

    /**
     * 设置请求分页数据 当前端未传排序参数,使用方法参数座位排序参数
     *
     * @param orderByColumn 指定排序的列名
     * @param isAsc         升序asc 降序desc
     */
    protected void startPage(String orderByColumn, String isAsc) {

        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
            //默认排序字段处理
            if (StringUtils.isEmpty(pageDomain.getOrderByColumn())) {
                pageDomain.setOrderByColumn(orderByColumn);
            }
            //默认排序方式处理
            if (StringUtils.isEmpty(pageDomain.getIsAsc())) {
                pageDomain.setIsAsc(isAsc);
            }
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            PageHelper.startPage(pageNum, pageSize, orderBy);
        }

    }

}
